<?php

// Η εφαρμογή "skOOlix" είναι μια απόπειρα προσομοίωσης της κίνησης ενός σκουληκιού
// σε πλακόστρωτο τερέν. Το σκουλήκι αποτελείται από «κύτταρα» όπου κάθε «κύτταρο»
// καταλαμβάνει ένα πλακίδιο του τερέν. Αρχικά το σκουλήκι τοποθετείται στο επάνω
// αριστερά μέρος του τερέν έχοντας την ουρά του στο επάνω αριστερά πλακίδιο και
// την κεφαλή του σε κάποιο πλακίδιο της επάνω γραμμής. Αν θέλουμε μπορούμε να έχουμε
// το σκουλήκι να εκτείνεται βουστροφηδόν σε περισσότερες γραμμές τοποθετώντας την
// κεφαλή του σκουληκιού σε οποιαδήποτε γραμμή του τερέν.

// Η ονομασία της εφαρμογής «φλερτάρει» με το λογότυπο του object oriented programming
// (OO) καθώς το πρόγραμμα γράφτηκε ως εισαγωγή στον αντικειμενοστρεφή προγραμματισμό.
// Πράγματι, μετά από μια κουβέντα που είχα τον Φλεβάρη του 2014 με τον Βασίλη Γιαννάτο,
// μου γεννήθηκε η ιδέα να αναπτύξω το πρόγραμμα προσομοίωσης της κίνησης του σκουληκιού
// σε πλακόστρωτο τερέν, αρχικά με απλό τρόπο και κατόπιν χρησιμοποιώντας τα εργαλεία τού
// αντικειμενοστρεφούς προγραμματισμού. Φυσικά κερδίζουμε πάρα πολλά, τόσο σε επίπεδο
// ανάπτυξης των σχετικών προγραμμάτων, όσο και σε ανταποδοτικά οφέλη στα οποία, πιθανόν,
// και να μην στοχεύαμε εκ των προτέρων. Ενώ, π.χ. με τον συμβατικό προγραμματισμό έχουμε
// ένα σκουλήκι σε ένα τερέν, με τον αντικειμενοστρεφή προγραμματισμό καθίσταται εύκολα
// δυνατόν να έχουμε ταυτόχρονα πολλά σκουλήκια σε διαφορετικά τερέν που ακολουθούν το
// καθένα τη δική του πορεία.

// Το πρόγραμμα παίρνει κάποιες παραμέτρους από το URL και αυτές αφορούν κύρια στο πλήθος
// των τερέν και στην default συμπεριφορά των σκουληκιών. Οι παράμετροι του προγράμματος
// είναι:
//
//	multi		Είναι ένας θετικός ακέραιος αριθμός και δείχνει το πλήθος των
//			τερέν (και των αντίστοιχων σκουληκιών).
//
//	speed		Είναι η ταχύτητα με την οποία κινείτα το σκουλήκι σε ms.
//
//	size		Είναι το μέγεθος των πλακιδίων της πλακόστρωσης του τερέν σε
//			pixel.
//
//	epimoni		Είναι ο βαθμός σταθερότητας της πορείας του σκουληκιού. Όσο πιο
//			μεγάλος ο βαθμός σταθερότητας, τόσο σπανιότερα το σκουλήκι μας
//			επιχειρεί να αλλάξει κατεύθυνση. Αν, π.χ. ο βαθμός σταθερότητας
//			είναι 7, τότε το σκουλήκι μας επιχερεί αλλαγή κατεύθυνσης περίπου
//			μια στις επτά φορές.

SkOOlix::settings();

?>

<html>
	<head>
		<title>skOOlix</title>
		<meta name="description" content="Object oriented worm animator">
		<meta name="keywords" content="object,class,method,JavaScript,animation,worm">
		<meta name="author" content="Panos Papadopoulos">
		<meta charset="UTF-8">
		<link rel="shortcut icon" href="favicon.ico" />
		<link rel="stylesheet" type="text/css" href="skoolix.css">
		<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
		<script type="text/javascript"><?php SkOOlix::stisimo(); ?></script>
		<script type="text/javascript" src="skoolix.js"></script>
	</head>
	<body>
	</body>
</html>

<?php

// Η ανάλυση των URL παραμέτρων και το πέρασμα των σχετικών τιμών στο JavaScript πρόγραμμα
// που οδηγεί τη σελίδα γίνεται με στατικές μεθόδους της κλάσης "SkOOlix".

class SkOOlix {
	public static $multi;
	public static $speed;
	public static $speedMin = 4;
	public static $speedMax = 2048;
	public static $size;
	public static $epimoni;
	public static $paleta;

	// Η μέθοδος "settings" ελέγχει αν περάστηκαν στο URL παράμετροι πολλαπλότητας,
	// ταχύτητας, μεγέθους, επιμονής κλπ. Οι παράμετροι ελέγχονται όσον αφορά την
	// ορθότητά τους και περνάνε σε static properties της κλάσης "SkOOlix".

	public static function settings() {
		self::$multi = is_numeric(@$_REQUEST["multi"]) ? intval($_REQUEST["multi"]) : 1;
		if (self::$multi < 1) self::$multi = 1;

		self::$speed = is_numeric(@$_REQUEST["speed"]) ? intval($_REQUEST["speed"]) : 64;
		if (self::$speed < self::$speedMin) self::$speed = self::$speedMin;
		else if (self::$speed > self::$speedMax) self::$speed = self::$speedMax;

		self::$size = is_numeric(@$_REQUEST["size"]) ? intval($_REQUEST["size"]) : 50;
		if (self::$size < 30) self::$size = 30;

		self::$epimoni = is_numeric(@$_REQUEST["epimoni"]) ? intval($_REQUEST["epimoni"]) : 5;
		if (self::$epimoni < 1) self::$epimoni = 1;

		self::$paleta = scandir("ikona/plakidio");
	}

	// Οι τιμές των παραμέτρων της εφαρμογής περνάνε στο JavaScript πρόγραμμα που οδηγεί
	// τη σελίδα μέσω ενός αντικειμένου που ονομάζουμε "SkOOlix" και χρησιμοποιείται ως
	// namespace και δεν έχει να κάνει με την ουσία του object oriented programming.

	public static function stisimo() {
		print "//<![CDATA[\n";
		?>
		SkOOlix = {
			multi: <?php print self::$multi; ?>,
			speed: <?php print self::$speed; ?>,
			speedMin: <?php print self::$speedMin; ?>,
			speedMax: <?php print self::$speedMax; ?>,
			size: <?php print self::$size; ?>,
			epimoni: <?php print self::$epimoni; ?>,
			paleta: [<?php self::print_paleta(); ?>],
		};
		<?php
		print "//]]>";
	}

	// Η μέθοδος "print_paleta" εκτυπώνει τα ονόματα των αρχείων εικόνας που θα χρησιμοποιηθούν
	// για τη διακόσμηση των πλακιδίων. Το πρόγραμμα ξεδιαλέγει μόνο τα αρχεία εικόνας μέσω του
	// mime type.

	private static function print_paleta() {
		for ($i = count(self::$paleta) - 1; $i > 1; $i--) {
			if (!exif_imagetype("ikona/plakidio/" . self::$paleta[$i])) continue;
			print "'" . self::$paleta[$i] . "',";
		}
	}
}

?>
